package com.basic.common.utils.sign;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * RSA加密解密
 * @author zhaoxy_jn@163.com
 */
public class RsaUtils {
    // Rsa 私钥
    public static String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCoNS6sA2Hsol7t\n" +
            "GWg9veEBHN4rGFcibdAKG+k6zPUy6+LpRSFUZYHhn/8S5CyYoGHuMgaZusTtwxQi\n" +
            "LLpQoBt0SoNPnuLJrr09UTEq3EA62U8FOLPCJpDlhVaKxNRp4QjvTmuFmrpu5qSJ\n" +
            "02AXgMErs5XTYIieXUwkuo7OVJlm5Ut1ZIS5XapBA+PwUO1Z3hgaXz0+o61AiP0i\n" +
            "bP8FiyU/QmAnJn4OW8aIxl+NuExprbEI9jrvIuj46w+K75mAf3HwH9hKO2x6V0X3\n" +
            "rXQpRhU+R8nCK2Put5D/Bf/pRp6XsmapAnTAY5PU2zza1TRMbuOlZJviZu00utyl\n" +
            "JF7+TjlxAgMBAAECggEAQyPPOEu1V43MFBmTGSnkWNxb9ZmmlhB8/Lv9UUIkESpE\n" +
            "jVXRou1NdXC2kKTRBC7oR/ph1hTNrBW0wJtX1vzBWJ6xYSOLZHNCB+qTlIcLgDHj\n" +
            "L7NdVP6t0V9ylrtQCd8QAO0tT8vd5IxdWsIrVdZHxJjPEeszPPsCfJqWi9cK0B3K\n" +
            "RafIhQnmLt/er/pXyrvtexMKbpwxlS8ht0yYWq2ImWC+tqMEZGLwujQyt4p/KI3H\n" +
            "EwZ+O7iksmHdOhwYfReICSfV/jG8aFOjFki6LnPbAcIq58UdNbZ9YXo2tm5HRjOo\n" +
            "MCusvUVl7HUiGt2nvUq4o0M9bmAupH7FTQ6JFt1CEQKBgQDXZ+3jV3RTSRA0z8TL\n" +
            "3k66PZj5MWdhPaIxkWOOQv4ZUqBOGmQS637skvpoCJMqxiBKgSQwlE/zApfufIFo\n" +
            "byWY+XHPoSnIy7mCDcgdomWcwuSiU8g0hCW9aBK1TEFHvk6t5ClrKaWUnWiYLVMo\n" +
            "YErU2wfWlfKb6U/558y221CrZQKBgQDH6DdXNDmTUquhva+Ruxhw/B1q76U5S9T3\n" +
            "K4zBq6Ru4mSrmmE1+Rdr3N8rGzTIW5+lVMoDXYG4dv1WHjPrC3+hlgCM7o3o6Omx\n" +
            "dRueOrgtCIiUhQ/naQvA0eCvkoevmzVAp0tkLmOyYDyRhCTEcZocVbr6B/G4F9by\n" +
            "tmpRXgwjHQKBgEhjXMZxtV3nx9J3oCMC6mIcITRdLei31bHisho02T+ZTNXyeH8D\n" +
            "NPw7yHr9prdRLbjb/VV2Agggbv5uSO7Xq0LlUSH9fxVDoWvbRczvrkYoGL2Uektr\n" +
            "vWMRfnf+0FFT2w0FCAZDUKnI3EWHtdJzybIOiWvLqGRM29uX0mwA9/MhAoGAfRoI\n" +
            "j+0h3t1MhVKEreltGT/dVQ+V0W5wXyIE2yqEI9RP9cgN783rZ1f43SwQcxZLqRaP\n" +
            "uV1qEbt9PMh36y7t93w86fVcH5aqsKA94V6T5bLCbld7JXFqpodxWc6UVUQHJmfL\n" +
            "WW1ifL2XCeWtcLY7IGJSOaiBD5jzrj6T+EmnxM0CgYEA0ZVYVcVoMLylrBJTCynH\n" +
            "RUf9yEtIJjmCfPSVPZe5S8vRoOL6Kfo8sw6CujNl1SMNjfp9lh2Hg53mqVFZkIwp\n" +
            "5wx11vj6LFYU6djR5UCMFizU+Mrx+zXor7QhpYt1DQaD0Ol9Yi00unXFb7K87aFq\n" +
            "FR3ioNVkPOYHDqI/g1+4rGU=";

    /**
     * 私钥解密
     *
     * @param text 待解密的文本
     * @return 解密后的文本
     */
    public static String decryptByPrivateKey(String text) throws Exception
    {
        return decryptByPrivateKey(privateKey, text);
    }

    /**
     * 公钥解密
     *
     * @param publicKeyString 公钥
     * @param text 待解密的信息
     * @return 解密后的文本
     */
    public static String decryptByPublicKey(String publicKeyString, String text) throws Exception
    {
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }

    /**
     * 私钥加密
     *
     * @param privateKeyString 私钥
     * @param text 待加密的信息
     * @return 加密后的文本
     */
    public static String encryptByPrivateKey(String privateKeyString, String text) throws Exception
    {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }

    /**
     * 私钥解密
     *
     * @param privateKeyString 私钥
     * @param text 待解密的文本
     * @return 解密后的文本
     */
    public static String decryptByPrivateKey(String privateKeyString, String text) throws Exception
    {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }

    /**
     * 公钥加密
     *
     * @param publicKeyString 公钥
     * @param text 待加密的文本
     * @return 加密后的文本
     */
    public static String encryptByPublicKey(String publicKeyString, String text) throws Exception
    {
        X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }

    /**
     * 构建RSA密钥对
     *
     * @return 生成后的公私钥信息
     */
    public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException
    {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
        String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
        String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
        return new RsaKeyPair(publicKeyString, privateKeyString);
    }

    /**
     * RSA密钥对对象
     */
    public static class RsaKeyPair
    {
        private final String publicKey;
        private final String privateKey;

        public RsaKeyPair(String publicKey, String privateKey)
        {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }

        public String getPublicKey()
        {
            return publicKey;
        }

        public String getPrivateKey()
        {
            return privateKey;
        }
    }
}
